1. Conociendo los datos

1.1 Cargue el paquete tidyverse

library(tidyverse)
── Attaching core tidyverse packages ─────────────────────────────────────────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.4     ✔ readr     2.1.5
✔ forcats   1.0.0     ✔ stringr   1.5.1
✔ ggplot2   3.5.1     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.1
✔ purrr     1.0.2     
── Conflicts ───────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the ]8;;http://conflicted.r-lib.org/conflicted package]8;; to force all conflicts to become errors

1.2 Lea el archivo death_handwashing.csv usando read_csv y asígnelo a una variable.

deaths_handwashing <- read_csv("deaths_handwashing.csv")
Rows: 12 Columns: 4
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): clinic
dbl (3): year, births, deaths

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

1.3 Imprima la variable del inciso 1.2

2 El alarmante número de muertes

La tabla anterior muestra el número de mujeres que dieron a luz durante los años 1841 a 1846 en una ciudad al noreste de Austria, en dos clínicas en particular. Notará que dar a luz era muy peligroso; un número alarmante de mujeres murió como resultado del parto. Vemos esto con mayor claridad si observamos la proporción de muertes con respecto al número de mujeres que dieron a luz.

2.1 Use mutate para agregar una nueva columna que se calculará como la proporción de muertes por número de nacimientos.

2.2 Imprima el dataset con lanueva variable.

3 Muerte en las clínicas

Si ahora graficamos la proporción de muertes en la clínica 1 como en la clínica 2, veremos un patrón curioso.

3.1 Utilice ggplot para hacer una gráfica lineal. Tome de referencia la columna creada en el inciso 2.1 (eje) versus la variable year (eje x).

3.2 Utilice la variable clinic para definir un color distinto en la estética de la gráfica.

3.3 Por último, imprima la gráfica y exponga su punto de vista.

4 Comienza el lavado de manos

¿Por qué la proporción de muertes es mucho más alta en la Clínica 1? La única diferencia en ambas clínicas era que muchos estudiantes de medicina trabajaban en la Clínica 1, mientras que en la Clínica 2 no había tantos. Otro dato interesante es que los médicos que atendían partos solo se encargaban de esa función, mientras que los estudiantes también pasaban tiempo en las salas de autopsias examinando cadáveres.

Se empezó a sospechar que algo en los cadáveres, propagado de las manos de los estudiantes de medicina, causaba la enfermedad. Entonces, en un intento desesperado por detener las altas tasas de mortalidad, se decretó: ¡Lávese las manos en todo momento!

4.1 Cargue los datos mensuales de la Clínica 1 para ver si el lavado de manos tuvo algún efecto, para esto lea el archivo deaths_clinic1.csv y asígnelo a una nueva variable.

deaths_clinic1 <- read_csv("deaths_clinic_1.csv")
Rows: 98 Columns: 3
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl  (2): births, deaths
date (1): date

ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.

4.2 Utilice ggplot para hacer una gráfica lineal. La gráfica tendrá la característica de ser dual (dos ejes Y). Para el eje X se utilizará la variable date y para Y1 y Y2, serán births y deaths respectivamente.

4.3 Utilice la funcion scale_y_continuous para agregar un título a cada eje Y.

4.4 Agregue un título al eje X y un título general a toda la gráfica.

4.5 Establezca color verde al comportamiento de la variable births y naranja para deaths.

4.6 Imprima la gráfica resultante.

Imprimir la grafica con plotly

4.7 Construya una opinión con el resultado de la gráfica.

5 El efecto del lavado de manos. Analicemos la proporción de muertes a lo largo del tiempo.

Perspectiva lineal ## 5.1 Agregue una nueva columna a la variable creada en el inciso 4.1. Esta nueva columna se calculará como la proporción de muertes por número de nacimientos. Guarde este cambio en una nueva variable.

5.2 Imprima las primeras filas del dataframe del punto anterior. Haga uso de la función head()

5.3 Elabore una gráfica lineal utilizando la columna creada en el incico 5.1 (eje y) versus la colunma date (eje x).

5.4 Utilice la funcion labs para dar al eje x y al eje y una estética a las etiquetas.

5.5 Por último, imprima la gráfica y concluya.

Perspectiva de barras

5.6 Use group_by para la variable year y summarise para encontrar la media tomando de referencia la variable del inciso 5.1. Guarde el resultado en una nueva variable.

5.7 Utilice la variable creada en el inciso anterior para crear un gráfico de barras que muestre la media en cada año.

5.8 Por último, imprima la grafica y concluya.

graficar con plotly

Los resultados del lavado de manos

A partir del año 1847 la proporción de muertes se reduce drásticamente y, sí, fue entonces cuando se hizo obligatorio el lavado de manos. El efecto del lavado de manos se hace aún más claro si lo resaltamos en el gráfico.

6.1 Agregue una columna a la variable creada en el inciso 5.1, está columna será TRUE a partir del año en que se impuso el lavado de manos y FALSE para años anteriores. Guarde este cambio en una nueva variable.

6.2 Construya una gráfica lineal tomando de referencia la variable con la proporción (muertes/nacimientos) para el eje y versus la variable date para el eje x. Haga que el color de la linea dependa de la columna creada en el inciso 6.1

6.3 Utilice la función labs para dar al eje x y al eje y una estética a las etiquetas.

6.4 Imprima la gráfica y concluya

7 ¿Más lavado de manos, menos muertes?

Nuevamente, las estadísticas muestran que lavarse las manos tuvo un efecto enorme. ¿Cuánto redujo la proporción mensual de muertes en promedio?

7.1 Tome de referencia la columna que se agregó en el inciso 6.1 y utilice la función groub_by para crear un agrupamiento.

monthly <- deaths_clinic1 %>%
  group_by(handwashing_started, year(date), month(date)) %>%
  summarise(mean_proportion_deaths = mean(proportion_deaths))
`summarise()` has grouped output by 'handwashing_started', 'year(date)'. You can override using the `.groups`
argument.

7.2 En continuidad al inciso anterior, aplique summarise para calcular el promedio de la proporción de muertes antes y después de que se impusiera el lavado de manos. Tome de referencia la variable con la proporción (muertes/nacimientos).

7.3 Asigne el resultado a una nueva variable e imprímala.

7.4 Utlice ggplot para crear un boxplot que tome de referencia la columna creada en el inciso 6.1 (eje x) versus la variable de proporción (muertes/nacimientos).

7.5 Imprima la gráfica y concluya en función de los incisos 7.3 y 7.4.

8 Análisis estadístico de los datos de lavado de manos

¡Redujo la proporción de muertes en alrededor de 8 puntos porcentuales! Del 10% en promedio antes del lavado de manos a solo el 2% cuando se hizo cumplir el lavado de manos (que sigue siendo un número alto según los estándares modernos). Para tener una idea de la incertidumbre en torno a cuánto se reduce la mortalidad por lavarse las manos, podríamos observar un intervalo de confianza (aquí calculado mediante una prueba t).

Utilice la función t.test para calcular un intervalo de confianza del 95%. Los dos grupos que tenemos son proporción mensual de muertes antes y después de que comenzara el lavado de manos. Tome de referencia la columna con la proporción (muertes/nacimientos) y la columna creada en el inciso 6.1.

t.test(monthly$mean_proportion_deaths ~ monthly$handwashing_started)

    Welch Two Sample t-test

data:  monthly$mean_proportion_deaths by monthly$handwashing_started
t = 6.7105, df = 84.198, p-value = 2.114e-09
alternative hypothesis: true difference in means between group FALSE and group TRUE is not equal to 0
95 percent confidence interval:
 0.05290915 0.09747238
sample estimates:
mean in group FALSE  mean in group TRUE 
         0.10691840          0.03172764 

Interprete los datos resultantes y proporcione una conclusión.

9 Análisis estadístico propio

9.1 Aplique funciones como filter, count, select o visualizaciones de tipo histograma o gráfica de puntos, que le permitan descubrir comportamientos o tendencias en los datos. No se limite a estas sugerencia, puede aplciar cualquier otro tipo de función.

9.2 Para cada análisis estadístico que proporcione concluya en función de los resultados obtenidos.

LS0tDQp0aXRsZTogIlByb3llY3RvIg0Kb3V0cHV0OiBodG1sX25vdGVib29rDQpuYW1lOiBKdWFuIENhcmxvcyBTb2xsb3kgWGljw7NuDQpjb3Vyc2U6IEZ1bmRhbWVudG9zIGRlIHByb2dyYW1hY2nDs24geSBzY3JpcHRpbmcNCmRhdGU6IDA4LTA3LTIwMjQNCi0tLQ0KDQojIDEuIENvbm9jaWVuZG8gbG9zIGRhdG9zDQoNCiMjIDEuMSBDYXJndWUgZWwgcGFxdWV0ZSB0aWR5dmVyc2UNCmBgYHtyfQ0KbGlicmFyeSh0aWR5dmVyc2UpDQpsaWJyYXJ5KHBsb3RseSkNCmBgYA0KDQojIyAxLjIgTGVhIGVsIGFyY2hpdm8gZGVhdGhfaGFuZHdhc2hpbmcuY3N2IHVzYW5kbyByZWFkX2NzdiB5IGFzw61nbmVsbyBhIHVuYSB2YXJpYWJsZS4NCmBgYHtyfQ0KZGVhdGhzX2hhbmR3YXNoaW5nIDwtIHJlYWRfY3N2KCJkZWF0aHNfaGFuZHdhc2hpbmcuY3N2IikNCmBgYA0KIyMgMS4zIEltcHJpbWEgbGEgdmFyaWFibGUgZGVsIGluY2lzbyAxLjINCmBgYHtyfQ0KZGVhdGhzX2hhbmR3YXNoaW5nDQpgYGANCiMgMiBFbCBhbGFybWFudGUgbsO6bWVybyBkZSBtdWVydGVzDQpMYSB0YWJsYSBhbnRlcmlvciBtdWVzdHJhIGVsIG7Dum1lcm8gZGUgbXVqZXJlcyBxdWUgZGllcm9uIGEgbHV6IGR1cmFudGUgbG9zIGHDsW9zIDE4NDEgYSAxODQ2IGVuIHVuYSBjaXVkYWQgYWwgbm9yZXN0ZSBkZSBBdXN0cmlhLCBlbiBkb3MgY2zDrW5pY2FzIGVuIHBhcnRpY3VsYXIuIE5vdGFyw6EgcXVlIGRhciBhIGx1eiBlcmEgbXV5IHBlbGlncm9zbzsgdW4gbsO6bWVybyBhbGFybWFudGUgZGUgbXVqZXJlcyBtdXJpw7MgY29tbyByZXN1bHRhZG8gZGVsIHBhcnRvLiBWZW1vcyBlc3RvIGNvbiBtYXlvciBjbGFyaWRhZCBzaSBvYnNlcnZhbW9zIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgY29uIHJlc3BlY3RvIGFsIG7Dum1lcm8gZGUgbXVqZXJlcyBxdWUgZGllcm9uIGEgbHV6Lg0KDQojIyAyLjEgVXNlIG11dGF0ZSBwYXJhIGFncmVnYXIgdW5hIG51ZXZhIGNvbHVtbmEgcXVlIHNlIGNhbGN1bGFyw6EgY29tbyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIHBvciBuw7ptZXJvIGRlIG5hY2ltaWVudG9zLg0KYGBge3J9DQpkZWF0aHNfaGFuZHdhc2hpbmcgPC0gZGVhdGhzX2hhbmR3YXNoaW5nICU+JQ0KICBtdXRhdGUocHJvcG9ydGlvbl9kZWF0aHMgPSBkZWF0aHMgLyBiaXJ0aHMpDQpgYGANCg0KIyMgMi4yIEltcHJpbWEgZWwgZGF0YXNldCBjb24gbGFudWV2YSB2YXJpYWJsZS4NCmBgYHtyfQ0KZGVhdGhzX2hhbmR3YXNoaW5nDQpgYGANCiMgMyBNdWVydGUgZW4gbGFzIGNsw61uaWNhcw0KU2kgYWhvcmEgZ3JhZmljYW1vcyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIGNsw61uaWNhIDEgY29tbyBlbiBsYSBjbMOtbmljYSAyLCB2ZXJlbW9zIHVuIHBhdHLDs24gY3VyaW9zby4NCg0KIyMgMy4xIFV0aWxpY2UgZ2dwbG90IHBhcmEgaGFjZXIgdW5hIGdyw6FmaWNhIGxpbmVhbC4gVG9tZSBkZSByZWZlcmVuY2lhIGxhIGNvbHVtbmEgY3JlYWRhIGVuIGVsIGluY2lzbyAyLjEgKGVqZSkgdmVyc3VzIGxhIHZhcmlhYmxlIHllYXIgKGVqZSB4KS4NCmBgYHtyfQ0KZ2dwbG90KGRlYXRoc19oYW5kd2FzaGluZywgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArDQogIGdlb21fbGluZSgpDQpgYGANCiMjIDMuMiBVdGlsaWNlIGxhIHZhcmlhYmxlIGNsaW5pYyBwYXJhIGRlZmluaXIgdW4gY29sb3IgZGlzdGludG8gZW4gbGEgZXN0w6l0aWNhIGRlIGxhIGdyw6FmaWNhLg0KYGBge3J9DQpnZ3Bsb3QoZGVhdGhzX2hhbmR3YXNoaW5nLCBhZXMoeCA9IHllYXIsIHkgPSBwcm9wb3J0aW9uX2RlYXRocywgY29sb3IgPSBjbGluaWMpKSArDQogIGdlb21fbGluZSgpDQpgYGANCiMjIDMuMyBQb3Igw7psdGltbywgaW1wcmltYSBsYSBncsOhZmljYSB5IGV4cG9uZ2Egc3UgcHVudG8gZGUgdmlzdGEuDQpgYGB7cn0NCmdncGxvdGx5KGdncGxvdChkZWF0aHNfaGFuZHdhc2hpbmcsIGFlcyh4ID0geWVhciwgeSA9IHByb3BvcnRpb25fZGVhdGhzLCBjb2xvciA9IGNsaW5pYykpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGFzIGNsw61uaWNhcyAxIHkgMiIsDQogICAgICAgeCA9ICJBw7FvIiwNCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKQ0KICAgICkNCmBgYA0KDQojIDQgQ29taWVuemEgZWwgbGF2YWRvIGRlIG1hbm9zDQoNCsK/UG9yIHF1w6kgbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlcyBtdWNobyBtw6FzIGFsdGEgZW4gbGEgQ2zDrW5pY2EgMT8gDQpMYSDDum5pY2EgZGlmZXJlbmNpYSBlbiBhbWJhcyBjbMOtbmljYXMgZXJhIHF1ZSBtdWNob3MgZXN0dWRpYW50ZXMgZGUgbWVkaWNpbmEgdHJhYmFqYWJhbiBlbiBsYSBDbMOtbmljYSAxLCBtaWVudHJhcyBxdWUgZW4gbGEgQ2zDrW5pY2EgMiBubyBoYWLDrWEgdGFudG9zLiANCk90cm8gZGF0byBpbnRlcmVzYW50ZSBlcyBxdWUgbG9zIG3DqWRpY29zIHF1ZSBhdGVuZMOtYW4gcGFydG9zIHNvbG8gc2UgZW5jYXJnYWJhbiBkZSBlc2EgZnVuY2nDs24sIG1pZW50cmFzIHF1ZSBsb3MgZXN0dWRpYW50ZXMgdGFtYmnDqW4gcGFzYWJhbiB0aWVtcG8gZW4gbGFzIHNhbGFzIGRlIGF1dG9wc2lhcyBleGFtaW5hbmRvIGNhZMOhdmVyZXMuDQoNClNlIGVtcGV6w7MgYSBzb3NwZWNoYXIgcXVlIGFsZ28gZW4gbG9zIGNhZMOhdmVyZXMsIHByb3BhZ2FkbyBkZSBsYXMgbWFub3MgZGUgbG9zIGVzdHVkaWFudGVzIGRlIG1lZGljaW5hLCBjYXVzYWJhIGxhIGVuZmVybWVkYWQuIA0KRW50b25jZXMsIGVuIHVuIGludGVudG8gZGVzZXNwZXJhZG8gcG9yIGRldGVuZXIgbGFzIGFsdGFzIHRhc2FzIGRlIG1vcnRhbGlkYWQsIHNlIGRlY3JldMOzOiDCoUzDoXZlc2UgbGFzIG1hbm9zIGVuIHRvZG8gbW9tZW50byENCg0KIyMgNC4xIENhcmd1ZSBsb3MgZGF0b3MgbWVuc3VhbGVzIGRlIGxhIENsw61uaWNhIDEgcGFyYSB2ZXIgc2kgZWwgbGF2YWRvIGRlIG1hbm9zIHR1dm8gYWxnw7puIGVmZWN0bywgcGFyYSBlc3RvIGxlYSBlbCBhcmNoaXZvIGRlYXRoc19jbGluaWMxLmNzdiB5IGFzw61nbmVsbyBhIHVuYSBudWV2YSB2YXJpYWJsZS4NCmBgYHtyfQ0KZGVhdGhzX2NsaW5pYzEgPC0gcmVhZF9jc3YoImRlYXRoc19jbGluaWNfMS5jc3YiKQ0KYGBgDQoNCiMjIDQuMiBVdGlsaWNlIGdncGxvdCBwYXJhIGhhY2VyIHVuYSBncsOhZmljYSBsaW5lYWwuIExhIGdyw6FmaWNhIHRlbmRyw6EgbGEgY2FyYWN0ZXLDrXN0aWNhIGRlIHNlciBkdWFsIChkb3MgZWplcyBZKS4gUGFyYSBlbCBlamUgWCBzZSB1dGlsaXphcsOhIGxhIHZhcmlhYmxlIGRhdGUgeSBwYXJhIFkxIHkgWTIsIHNlcsOhbiBiaXJ0aHMgeSBkZWF0aHMgcmVzcGVjdGl2YW1lbnRlLg0KYGBge3J9DQpnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSkpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGRlYXRocywgY29sb3IgPSAiTXVlcnRlcyIpKSArDQogIHNjYWxlX3lfY29udGludW91cyhzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAqIDAuMSwgbmFtZSA9ICJNdWVydGVzIikpDQpgYGANCiMjIDQuMyBVdGlsaWNlIGxhIGZ1bmNpb24gc2NhbGVfeV9jb250aW51b3VzIHBhcmEgYWdyZWdhciB1biB0w610dWxvIGEgY2FkYSBlamUgWS4NCmBgYHtyfQ0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGJpcnRocywgY29sb3IgPSAiTmFjaW1pZW50b3MiKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBkZWF0aHMsIGNvbG9yID0gIk11ZXJ0ZXMiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOYWNpbWllbnRvcyIsIHNlYy5heGlzID0gc2VjX2F4aXMofiAuICogMC4xLCBuYW1lID0gIk11ZXJ0ZXMiKSkNCmBgYA0KIyMgNC40IEFncmVndWUgdW4gdMOtdHVsbyBhbCBlamUgWCB5IHVuIHTDrXR1bG8gZ2VuZXJhbCBhIHRvZGEgbGEgZ3LDoWZpY2EuDQoNCmBgYHtyfQ0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGJpcnRocywgY29sb3IgPSAiTmFjaW1pZW50b3MiKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBkZWF0aHMsIGNvbG9yID0gIk11ZXJ0ZXMiKSkgKw0KICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOYWNpbWllbnRvcyIsIHNlYy5heGlzID0gc2VjX2F4aXMofiAuICogMC4xLCBuYW1lID0gIk11ZXJ0ZXMiKSkgKw0KICBsYWJzKHRpdGxlID0gIk5hY2ltaWVudG9zIHkgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwNCiAgICAgICB4ID0gIkZlY2hhIikNCmBgYA0KIyMgNC41IEVzdGFibGV6Y2EgY29sb3IgdmVyZGUgYWwgY29tcG9ydGFtaWVudG8gZGUgbGEgdmFyaWFibGUgYmlydGhzIHkgbmFyYW5qYSBwYXJhIGRlYXRocy4gDQpgYGB7cn0NCmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlKSkgKw0KICBnZW9tX2xpbmUoYWVzKHkgPSBiaXJ0aHMsIGNvbG9yID0gIk5hY2ltaWVudG9zIikpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gZGVhdGhzLCBjb2xvciA9ICJNdWVydGVzIikpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTmFjaW1pZW50b3MiLCBzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAqIDAuMSwgbmFtZSA9ICJNdWVydGVzIikpICsNCiAgbGFicyh0aXRsZSA9ICJOYWNpbWllbnRvcyB5IG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSIsDQogICAgICAgeCA9ICJGZWNoYSIpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIk5hY2ltaWVudG9zIiA9ICJncmVlbiIsICJNdWVydGVzIiA9ICJvcmFuZ2UiKSkNCmBgYA0KIyMgNC42IEltcHJpbWEgbGEgZ3LDoWZpY2EgcmVzdWx0YW50ZS4NCkltcHJpbWlyIGxhIGdyYWZpY2EgY29uIHBsb3RseQ0KYGBge3J9DQpnZ3Bsb3RseShnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSkpICsNCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArDQogIGdlb21fbGluZShhZXMoeSA9IGRlYXRocywgY29sb3IgPSAiTXVlcnRlcyIpKSArDQogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk5hY2ltaWVudG9zIiwgc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gKiAwLjEsIG5hbWUgPSAiTXVlcnRlcyIpKSArDQogIGxhYnModGl0bGUgPSAiTmFjaW1pZW50b3MgeSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLA0KICAgICAgIHggPSAiRmVjaGEiKSArDQogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJOYWNpbWllbnRvcyIgPSAiZ3JlZW4iLCAiTXVlcnRlcyIgPSAib3JhbmdlIikpDQopDQpgYGANCg0KIyMgNC43IENvbnN0cnV5YSB1bmEgb3BpbmnDs24gY29uIGVsIHJlc3VsdGFkbyBkZSBsYSBncsOhZmljYS4NCg0KIyA1IEVsIGVmZWN0byBkZWwgbGF2YWRvIGRlIG1hbm9zLiBBbmFsaWNlbW9zIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLg0KDQpQZXJzcGVjdGl2YSBsaW5lYWwNCiMjIDUuMSBBZ3JlZ3VlIHVuYSBudWV2YSBjb2x1bW5hIGEgbGEgdmFyaWFibGUgY3JlYWRhIGVuIGVsIGluY2lzbyA0LjEuIEVzdGEgbnVldmEgY29sdW1uYSBzZSBjYWxjdWxhcsOhIGNvbW8gbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBwb3IgbsO6bWVybyBkZSBuYWNpbWllbnRvcy4gR3VhcmRlIGVzdGUgY2FtYmlvIGVuIHVuYSBudWV2YSB2YXJpYWJsZS4NCmBgYHtyfQ0KZGVhdGhzX2NsaW5pYzEgPC0gZGVhdGhzX2NsaW5pYzEgJT4lDQogIG11dGF0ZShwcm9wb3J0aW9uX2RlYXRocyA9IGRlYXRocyAvIGJpcnRocykNCmBgYA0KDQoNCiMjIDUuMiBJbXByaW1hIGxhcyBwcmltZXJhcyBmaWxhcyBkZWwgZGF0YWZyYW1lIGRlbCBwdW50byBhbnRlcmlvci4gSGFnYSB1c28gZGUgbGEgZnVuY2nDs24gaGVhZCgpDQpgYGB7cn0NCmhlYWQoZGVhdGhzX2NsaW5pYzEpDQpgYGANCg0KIyMgNS4zIEVsYWJvcmUgdW5hIGdyw6FmaWNhIGxpbmVhbCB1dGlsaXphbmRvIGxhIGNvbHVtbmEgY3JlYWRhIGVuIGVsIGluY2ljbyA1LjEgKGVqZSB5KSB2ZXJzdXMgbGEgY29sdW5tYSBkYXRlIChlamUgeCkuDQoNCmBgYHtyfQ0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocykpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KDQojIyA1LjQgVXRpbGljZSBsYSBmdW5jaW9uIGxhYnMgcGFyYSBkYXIgYWwgZWplIHggeSBhbCBlamUgeSB1bmEgZXN0w6l0aWNhIGEgbGFzIGV0aXF1ZXRhcy4NCmBgYHtyfQ0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocykpICsNCiAgZ2VvbV9saW5lKCkgKw0KICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSIsDQogICAgICAgeCA9ICJGZWNoYSIsDQogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIikNCmBgYA0KIyMgNS41IFBvciDDumx0aW1vLCBpbXByaW1hIGxhIGdyw6FmaWNhIHkgY29uY2x1eWEuDQpgYGB7cn0NCmdncGxvdGx5KGdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLA0KICAgICAgIHggPSAiRmVjaGEiLA0KICAgICAgIHkgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyIpDQopDQpgYGANClBlcnNwZWN0aXZhIGRlIGJhcnJhcw0KDQojIyA1LjYgVXNlIGdyb3VwX2J5IHBhcmEgbGEgdmFyaWFibGUgeWVhciB5IHN1bW1hcmlzZSBwYXJhIGVuY29udHJhciBsYSBtZWRpYSB0b21hbmRvIGRlIHJlZmVyZW5jaWEgbGEgdmFyaWFibGUgZGVsIGluY2lzbyA1LjEuIEd1YXJkZSBlbCByZXN1bHRhZG8gZW4gdW5hIG51ZXZhIHZhcmlhYmxlLg0KDQpgYGB7cn0NCmRlYXRoc19jbGluaWMxJHllYXIgPC0geWVhcihkZWF0aHNfY2xpbmljMSRkYXRlKQ0KZGVhdGhzX2NsaW5pYzFfeWVhcmx5IDwtIGRlYXRoc19jbGluaWMxICU+JQ0KICBncm91cF9ieSh5ZWFyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMgPSBtZWFuKHByb3BvcnRpb25fZGVhdGhzKSkNCmBgYA0KDQojIyA1LjcgVXRpbGljZSBsYSB2YXJpYWJsZSBjcmVhZGEgZW4gZWwgaW5jaXNvIGFudGVyaW9yIHBhcmEgY3JlYXIgdW4gZ3LDoWZpY28gZGUgYmFycmFzIHF1ZSBtdWVzdHJlIGxhIG1lZGlhIGVuIGNhZGEgYcOxby4NCg0KYGBge3J9DQpnZ3Bsb3QoZGVhdGhzX2NsaW5pYzFfeWVhcmx5LCBhZXMoeCA9IHllYXIsIHkgPSBtZWFuX3Byb3BvcnRpb25fZGVhdGhzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikNCmBgYA0KDQojIyA1LjggUG9yIMO6bHRpbW8sIGltcHJpbWEgbGEgZ3JhZmljYSB5IGNvbmNsdXlhLg0KZ3JhZmljYXIgY29uIHBsb3RseQ0KYGBge3J9DQpnZ3Bsb3RseShnZ3Bsb3QoZGVhdGhzX2NsaW5pYzFfeWVhcmx5LCBhZXMoeCA9IHllYXIsIHkgPSBtZWFuX3Byb3BvcnRpb25fZGVhdGhzKSkgKw0KICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKw0KICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcHJvbWVkaW8gZW4gbGEgQ2zDrW5pY2EgMSIsDQogICAgICAgeCA9ICJBw7FvIiwNCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcHJvbWVkaW8iKQ0KKQ0KYGBgDQojIExvcyByZXN1bHRhZG9zIGRlbCBsYXZhZG8gZGUgbWFub3MNCg0KQSBwYXJ0aXIgZGVsIGHDsW8gMTg0NyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIHNlIHJlZHVjZSBkcsOhc3RpY2FtZW50ZSB5LCBzw60sIGZ1ZSBlbnRvbmNlcyBjdWFuZG8gc2UgaGl6byBvYmxpZ2F0b3JpbyBlbCBsYXZhZG8gZGUgbWFub3MuDQpFbCBlZmVjdG8gZGVsIGxhdmFkbyBkZSBtYW5vcyBzZSBoYWNlIGHDum4gbcOhcyBjbGFybyBzaSBsbyByZXNhbHRhbW9zIGVuIGVsIGdyw6FmaWNvLg0KDQojIDYuMSBBZ3JlZ3VlIHVuYSBjb2x1bW5hIGEgbGEgdmFyaWFibGUgY3JlYWRhIGVuIGVsIGluY2lzbyA1LjEsIGVzdMOhIGNvbHVtbmEgc2Vyw6EgVFJVRSBhIHBhcnRpciBkZWwgYcOxbyBlbiBxdWUgc2UgaW1wdXNvIGVsIGxhdmFkbyBkZSBtYW5vcyB5IEZBTFNFIHBhcmEgYcOxb3MgYW50ZXJpb3Jlcy4gR3VhcmRlIGVzdGUgY2FtYmlvIGVuIHVuYSBudWV2YSB2YXJpYWJsZS4NCmBgYHtyfQ0KZGVhdGhzX2NsaW5pYzEgPC0gZGVhdGhzX2NsaW5pYzEgJT4lDQogIG11dGF0ZShoYW5kd2FzaGluZ19zdGFydGVkID0gZGF0ZSA+PSAiMTg0Ny0wMS0wMSIpDQpgYGANCg0KIyMgNi4yIENvbnN0cnV5YSB1bmEgZ3LDoWZpY2EgbGluZWFsIHRvbWFuZG8gZGUgcmVmZXJlbmNpYSBsYSB2YXJpYWJsZSBjb24gbGEgcHJvcG9yY2nDs24gKG11ZXJ0ZXMvbmFjaW1pZW50b3MpIHBhcmEgZWwgZWplIHkgdmVyc3VzIGxhIHZhcmlhYmxlIGRhdGUgcGFyYSBlbCBlamUgeC4gSGFnYSBxdWUgZWwgY29sb3IgZGUgbGEgbGluZWEgZGVwZW5kYSBkZSBsYSBjb2x1bW5hIGNyZWFkYSBlbiBlbCBpbmNpc28gNi4xDQpgYGB7cn0NCmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gaGFuZHdhc2hpbmdfc3RhcnRlZCkpICsNCiAgZ2VvbV9saW5lKCkNCmBgYA0KIyMgNi4zIFV0aWxpY2UgbGEgZnVuY2nDs24gbGFicyBwYXJhIGRhciBhbCBlamUgeCB5IGFsIGVqZSB5IHVuYSBlc3TDqXRpY2EgYSBsYXMgZXRpcXVldGFzLg0KYGBge3J9DQpnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSwgeSA9IHByb3BvcnRpb25fZGVhdGhzLCBjb2xvciA9IGhhbmR3YXNoaW5nX3N0YXJ0ZWQpKSArDQogIGdlb21fbGluZSgpICsNCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLA0KICAgICAgIHggPSAiRmVjaGEiLA0KICAgICAgIHkgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyIpDQpgYGANCiMjIDYuNCBJbXByaW1hIGxhIGdyw6FmaWNhIHkgY29uY2x1eWENCmBgYHtyfQ0KZ2dwbG90bHkoZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocywgY29sb3IgPSBoYW5kd2FzaGluZ19zdGFydGVkKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwNCiAgICAgICB4ID0gIkZlY2hhIiwNCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKSkNCmBgYA0KIyA3IMK/TcOhcyBsYXZhZG8gZGUgbWFub3MsIG1lbm9zIG11ZXJ0ZXM/DQoNCk51ZXZhbWVudGUsIGxhcyBlc3RhZMOtc3RpY2FzIG11ZXN0cmFuIHF1ZSBsYXZhcnNlIGxhcyBtYW5vcyB0dXZvIHVuIGVmZWN0byBlbm9ybWUuIMK/Q3XDoW50byByZWR1am8gbGEgcHJvcG9yY2nDs24gbWVuc3VhbCBkZSBtdWVydGVzIGVuIHByb21lZGlvPw0KDQojIyA3LjEgVG9tZSBkZSByZWZlcmVuY2lhIGxhIGNvbHVtbmEgcXVlIHNlIGFncmVnw7MgZW4gZWwgaW5jaXNvIDYuMSB5IHV0aWxpY2UgbGEgZnVuY2nDs24gZ3JvdWJfYnkgcGFyYSBjcmVhciB1biBhZ3J1cGFtaWVudG8uDQoNCmBgYHtyfQ0KZGVhdGhzX2NsaW5pYzEkbW9udGggPC0gbW9udGgoZGVhdGhzX2NsaW5pYzEkZGF0ZSkNCm1vbnRobHkgPC0gZGVhdGhzX2NsaW5pYzEgJT4lDQogIGdyb3VwX2J5KGhhbmR3YXNoaW5nX3N0YXJ0ZWQsIHllYXIoZGF0ZSksIG1vbnRoKGRhdGUpKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMgPSBtZWFuKHByb3BvcnRpb25fZGVhdGhzKSkNCmBgYA0KIyMgNy4yIEVuIGNvbnRpbnVpZGFkIGFsIGluY2lzbyBhbnRlcmlvciwgYXBsaXF1ZSBzdW1tYXJpc2UgcGFyYSBjYWxjdWxhciBlbCBwcm9tZWRpbyBkZSBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGFudGVzIHkgZGVzcHXDqXMgZGUgcXVlIHNlIGltcHVzaWVyYSBlbCBsYXZhZG8gZGUgbWFub3MuIFRvbWUgZGUgcmVmZXJlbmNpYSBsYSB2YXJpYWJsZSBjb24gbGEgcHJvcG9yY2nDs24gKG11ZXJ0ZXMvbmFjaW1pZW50b3MpLg0KYGBge3J9DQptb250aGx5X3N1bW1hcnkgPC0gbW9udGhseSAlPiUNCiAgZ3JvdXBfYnkoaGFuZHdhc2hpbmdfc3RhcnRlZCkgJT4lDQogIHN1bW1hcmlzZShtZWFuX3Byb3BvcnRpb25fZGVhdGhzID0gbWVhbihtZWFuX3Byb3BvcnRpb25fZGVhdGhzKSkNCmBgYA0KDQojIyA3LjMgQXNpZ25lIGVsIHJlc3VsdGFkbyBhIHVuYSBudWV2YSB2YXJpYWJsZSBlIGltcHLDrW1hbGEuIA0KDQpgYGB7cn0NCm1vbnRobHlfc3VtbWFyeQ0KYGBgDQojIyA3LjQgVXRsaWNlIGdncGxvdCBwYXJhIGNyZWFyIHVuIGJveHBsb3QgcXVlIHRvbWUgZGUgcmVmZXJlbmNpYSBsYSBjb2x1bW5hIGNyZWFkYSBlbiBlbCBpbmNpc28gNi4xIChlamUgeCkgdmVyc3VzIGxhIHZhcmlhYmxlIGRlIHByb3BvcmNpw7NuIChtdWVydGVzL25hY2ltaWVudG9zKS4NCmBgYHtyfQ0KZ2dwbG90KG1vbnRobHksIGFlcyh4ID0gaGFuZHdhc2hpbmdfc3RhcnRlZCwgeSA9IG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMpKSArDQogIGdlb21fYm94cGxvdCgpDQpgYGANCg0KIyMgNy41IEltcHJpbWEgbGEgZ3LDoWZpY2EgeSBjb25jbHV5YSBlbiBmdW5jacOzbiBkZSBsb3MgaW5jaXNvcyA3LjMgeSA3LjQuDQpgYGB7cn0NCmdncGxvdChtb250aGx5LCBhZXMoeCA9IGhhbmR3YXNoaW5nX3N0YXJ0ZWQsIHkgPSBtZWFuX3Byb3BvcnRpb25fZGVhdGhzKSkgKw0KICBnZW9tX2JveHBsb3QoKQ0KYGBgDQojIDggQW7DoWxpc2lzIGVzdGFkw61zdGljbyBkZSBsb3MgZGF0b3MgZGUgbGF2YWRvIGRlIG1hbm9zDQoNCg0KwqFSZWR1am8gbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBhbHJlZGVkb3IgZGUgOCBwdW50b3MgcG9yY2VudHVhbGVzISBEZWwgMTAlIGVuIHByb21lZGlvIGFudGVzIGRlbCBsYXZhZG8gZGUgbWFub3MgYSBzb2xvIGVsIDIlIGN1YW5kbyBzZSBoaXpvIGN1bXBsaXIgZWwgbGF2YWRvIGRlIG1hbm9zIChxdWUgc2lndWUgc2llbmRvIHVuIG7Dum1lcm8gYWx0byBzZWfDum4gbG9zIGVzdMOhbmRhcmVzIG1vZGVybm9zKS4gUGFyYSB0ZW5lciB1bmEgaWRlYSBkZSBsYSBpbmNlcnRpZHVtYnJlIGVuIHRvcm5vIGEgY3XDoW50byBzZSByZWR1Y2UgbGEgbW9ydGFsaWRhZCBwb3IgbGF2YXJzZSBsYXMgbWFub3MsIHBvZHLDrWFtb3Mgb2JzZXJ2YXIgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSAoYXF1w60gY2FsY3VsYWRvIG1lZGlhbnRlIHVuYSBwcnVlYmEgdCkuDQoNClV0aWxpY2UgbGEgZnVuY2nDs24gdC50ZXN0IHBhcmEgY2FsY3VsYXIgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSBkZWwgOTUlLiBMb3MgZG9zIGdydXBvcyBxdWUgdGVuZW1vcyBzb24gcHJvcG9yY2nDs24gbWVuc3VhbCBkZSBtdWVydGVzIGFudGVzIHkgZGVzcHXDqXMgZGUgcXVlIGNvbWVuemFyYSBlbCBsYXZhZG8gZGUgbWFub3MuIFRvbWUgZGUgcmVmZXJlbmNpYSBsYSBjb2x1bW5hIGNvbiBsYSBwcm9wb3JjacOzbiAobXVlcnRlcy9uYWNpbWllbnRvcykgeSBsYSBjb2x1bW5hIGNyZWFkYSBlbiBlbCBpbmNpc28gNi4xLg0KYGBge3J9DQp0LnRlc3QobW9udGhseSRtZWFuX3Byb3BvcnRpb25fZGVhdGhzIH4gbW9udGhseSRoYW5kd2FzaGluZ19zdGFydGVkKQ0KYGBgDQpJbnRlcnByZXRlIGxvcyBkYXRvcyByZXN1bHRhbnRlcyB5IHByb3BvcmNpb25lIHVuYSBjb25jbHVzacOzbi4NCg0KIyA5IEFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcHJvcGlvDQoNCiMjIDkuMSBBcGxpcXVlIGZ1bmNpb25lcyBjb21vIGZpbHRlciwgY291bnQsIHNlbGVjdCBvIHZpc3VhbGl6YWNpb25lcyBkZSB0aXBvIGhpc3RvZ3JhbWEgbyBncsOhZmljYSBkZSBwdW50b3MsIHF1ZSBsZSBwZXJtaXRhbiBkZXNjdWJyaXIgY29tcG9ydGFtaWVudG9zIG8gdGVuZGVuY2lhcyBlbiBsb3MgZGF0b3MuIE5vIHNlIGxpbWl0ZSBhIGVzdGFzIHN1Z2VyZW5jaWEsIHB1ZWRlIGFwbGNpYXIgY3VhbHF1aWVyIG90cm8gdGlwbyBkZSBmdW5jacOzbi4NCmBgYHtyfQ0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocywgY29sb3IgPSBoYW5kd2FzaGluZ19zdGFydGVkKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwNCiAgICAgICB4ID0gIkZlY2hhIiwNCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKQ0KYGBgDQojIyA5LjIgUGFyYSBjYWRhIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcXVlIHByb3BvcmNpb25lIGNvbmNsdXlhIGVuIGZ1bmNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcy4NCmBgYHtyfQ0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocywgY29sb3IgPSBoYW5kd2FzaGluZ19zdGFydGVkKSkgKw0KICBnZW9tX2xpbmUoKSArDQogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwNCiAgICAgICB4ID0gIkZlY2hhIiwNCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKQ0KYGBg